
from app import create_app
from flask_migrate import Migrate
from app.exts import db
from app.models import User
from flask import current_app
from flask.cli import AppGroup,FlaskGroup,run_command,with_appcontext
import click

app = create_app()
migrate = Migrate(app,db)


# export FLASK_APP=manage2.py

# https://www.cnblogs.com/Liu928011/p/15035140.html
# 第二坑：当使用sqlite时的alter
# 这次坑的是sqlite，主要是sqlite自己太坑。它不支持drop列，不支持完整的数据库alter语句功能等等。
# 当使用sqlite做migrate和upgrade以及downgrade时，模型有字段的减少或者约束的减少，会报错：
# sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "DROP": 
# syntax error [SQL: ALTER TABLE account DROP COLUMN name]

# 解决方法：
# 初始化Migrate对象时可以设置其提交类型为批处理 migrate = Migrate(db=db, render_as_batch=True)
# 以批处理的方式做表结构修改sqlite是支持的，但是批处理本身有安全性的问题。批处理提升了效率，
# 但是丧失了原子性，其中某些sql语句出错我们并不能直接感知到。所以尽量对migrate生成的脚本进行人工检查吧，不怕一万就怕万一。

# 方式1
@app.cli.command('create-user')
@click.argument('name')
def create_user1(name):
    print(f'name:{name}')
    

# 方式2：使用命令组
# 创建一个命令组
run_cli = AppGroup('run', help="Run server commands") 
db_cli = AppGroup('db', help="db related commands")
user_cli = AppGroup('users', help="User related commands")

@run_cli.command('run') # 方式1
def run():
    app.run(host='127.0.0.1',port=5000,debug=True)
    # ,use_reloader=False
@click.command()  # 方式2
@with_appcontext
def runserver():
    app.run(host='127.0.0.1',port=5000,debug=True)
    
    
@db_cli.command('init')
def init_db():
    db.create_all()
    print('初始化迁移仓库')

@db_cli.command('migrate')
def migrate_db():
    db.drop_all()
    db.create_all()
    print('迁移数据库')

@db_cli.command('upgrade')
def upgrade_db():
    migrate.upgrade() # 调用迁移脚本      
    print('迁移脚本映射到数据库')


@user_cli.command("create")
# @click.argument('name') # 必填参数
@click.option('-n','--name', default=None, help="user name")
@click.option('-e','--email', default=None, help="user email address") # 可选参数
def create_user(name,email):
    userobj = User()
    userobj.username = name
    userobj.password = '123456'
    userobj.repassword = '123456'
    userobj.phone = '15821600530'
    
    userobj.email = email
    
    db.session.add(userobj)
    db.session.commit()
    
    # name = 'admin'
    print(f'name:{name},email:{email}')
            
# 将命令组添加到应用
app.cli.add_command(db_cli)
app.cli.add_command(user_cli)
app.cli.add_command(run_cli)
app.cli.add_command(runserver)    

     
if __name__ == '__main__':
    app.cli()
